# 前言
有时候我们需要周期性的执行一些脚本,有时候需要在有必要的时候通过触发执行一些脚本。我们有点追求,需要知道任务执行的时间,执行的状态,执行的日志。这么一整套其实是个挺复杂的需求,那么有没有现成的,优雅的解决方案呢?答案是有!那就是 Github Actions!
# 为什么不是 crontab
- 需要有自己的服务器(这对于开发人员都是基础设施,应该人人都有,可是这里面真正的成本是迁移成本)
- 执行状态,日志需要进入服务器才能查看
- 修改比较麻烦
# Github Actions 是什么
Github Actions 是一个基于 GitHub 事件的 CI/CD pipeline,在微软收购 GitHub 之前,大家基本都是用的 CircleCI 或者 TravisCI 之类的,收购之后,由于微软自家平台本来就有 Azure pipeline 服务,所以就诞生了 Github Actions,其实相当于 Azure pipeline 的定制版本。
Github Actions 有什么相比别的有什么亮点呢?其实最大的亮点就是支持 Schedule 任务,也就是你可以通过 crontab 的方式执行任务。
# 如何使用
# 配置
最核心的一点,其实就是在你的项目里面建一个 .github/workflows 文件夹,然后在里面新建一个(也支持多个) {name}.yml 文件作为配置文件。
# cron.yml
name: Cron CI
on:
schedule:
- cron: '0 * * * *' # 触发配置,每小时执行一次
jobs:
build:
runs-on: ubuntu-latest # 选择执行环境
steps:
- name: test # 执行相应指令
run: echo done!
2
3
4
5
6
7
8
9
10
11
12
13
这个运行环境其实里面预装了好多基础软件和工具,基本的 node,python,golang 等都已经装好了, 可以在 这里 查看。
可以选择使用自己熟悉的高级语言来写脚本,这样每次执行之前,我们需要把自己的 repo checkout 下来,所以需要加一点配置:
#...
steps:
- uses: actions/checkout@v1 # checkout 代码
- name: run script # 执行脚本
run: node test.js
#...
2
3
4
5
6
注意:由于执行器启动需要时间,所以只能保证在配置的时间点,执行器开始启动,而不是开始执行脚本。
# 安全
执行脚本可能需要一些敏感的配置,Github Actions 支持配置 secrets,具体文档在 这里。
# 进阶操作
如果需要在不同时候触发不同脚本,难道我们需要创建多个 repo ?
不,我们不需要,这样太过愚蠢。
其实我们可以读取本次触发的事件信息,GITHUB_EVENT_PATH 这个环境变量就是文件路径,例如:/github/workflow/event.json,这里面可以拿到更多东西。
例如,可以拿到提交信息之类的有用信息,接着就可以发挥了,比如在提交信息中配置关键字,通过不同关键字,执行不同脚本。
...
"id": "3ab970e8b88b70f344e99e546f79a11252fc5e625",
"message": "test",
"modified": [
".github/workflows/schedule.yml"
],
...
2
3
4
5
6
7
# 总结
这样我们就拥有了一个免费的,功能齐全的 Task Runner。